package com.ishitong.platform.utils.hibernate;

import java.util.concurrent.atomic.AtomicLong;

/**
 * long型序列号产生器<br>
 * 利用JDK 1.5中的AtomicLong进行长整型序列号的生成
 * 
 * @see AtomicLong
 */
public class LongSequence {
	private final AtomicLong id = new AtomicLong(0l);
	private long maxValue;

	/**
	 * 取得当前的长整型数，并递增指定的增量
	 * 
	 * @param granularity
	 *            递增的增量
	 * @return 递增前的值
	 */
	public long getNextId(long granularity) {
		synchronized (id) {
			long seq = id.getAndAdd(granularity);
			if (seq >= maxValue) {
				seq = seq - maxValue;
				id.set(seq);
			}
			return seq;
		}
	}

	/**
	 * 设置序列号发生器的最大值，如果超过则重新从0开始计
	 * 
	 * @param maxValue
	 *            最大值
	 */
	public void setMaxValue(long maxValue) {
		this.maxValue = maxValue;
	}
}
